﻿using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using DomainModel;

namespace EntityFrameworkRepository
{
    public class TechDays2012Db : DbContext
    {

#region Singleton implemenation

        private static TechDays2012Db _instance = null;
        public static TechDays2012Db Instance
        {
            get { return _instance ?? (_instance = new TechDays2012Db()); }
        }

#endregion

        public IDbSet<Signalement> Signalements { get; set; }
        public IDbSet<ObjetPatrimonial> ObjetPatrimoniaux { get; set; }
        public IDbSet<Panne> Pannes { get; set; }

        private TechDays2012Db() : base()
        {
            Database.SetInitializer(new TechDays2012DbInitializer());
        }
    }

    public class TechDays2012DbInitializer : DropCreateDatabaseIfModelChanges<TechDays2012Db>
    {
        protected override void Seed(TechDays2012Db context)
        {
            List<Panne> pannes;
            List<ObjetPatrimonial> objetPatrimoniaux;

            CreatePannes(context, out pannes);
            CreateObjetPatromaniaux(context, out  objetPatrimoniaux);
            CreateSignalements(context, pannes, objetPatrimoniaux);
        }

        private void CreatePannes(TechDays2012Db context, out List<Panne> pannes)
        {
            pannes = new List<Panne>()
                           {
                               new Panne("LMP-CA", "Lampe cassée", PanneSeverity.Moderate),
                               new Panne("SUP-PL", "Support légèrement plié", PanneSeverity.Moderate),
                               new Panne("SUP-AR", "Support arraché du sol", PanneSeverity.Serious),
                               new Panne("CBL-SE","Cable d'alimentation sectionné", PanneSeverity.Serious)
                           };

            pannes.ForEach(item => context.Pannes.Add(item));
        }

        private void CreateObjetPatromaniaux(TechDays2012Db context, out List<ObjetPatrimonial> objetPatrimoniaux)
        {
            objetPatrimoniaux = new List<ObjetPatrimonial>()
                           {
                               new ObjetPatrimonial("CAN-01","Candélabre") {Age = 3, Town = "Marseille", State = ObjetPatrimonialState.FullyOperational},
                               new ObjetPatrimonial("FRO-01","Feu rouge") {Age = 15, Town = "Marseille", State = ObjetPatrimonialState.PartiallyOperational},
                               new ObjetPatrimonial("RAD-01","Radar") {Age = 7, Town = "Paris", State = ObjetPatrimonialState.FullyOperational},
                               new ObjetPatrimonial("CAN-02","Lampadaire") {Age = 17, Town = "Paris", State = ObjetPatrimonialState.PartiallyOperational},
                               new ObjetPatrimonial("FRO-02","Panneau publicitaire") {Age = 1, Town = "Aix-en-Provence", State = ObjetPatrimonialState.FullyOperational}
                           };

            objetPatrimoniaux.ForEach(item => context.ObjetPatrimoniaux.Add(item));
        }

        private void CreateSignalements(TechDays2012Db context, List<Panne> pannes, List<ObjetPatrimonial> objetPatrimoniaux)
        {
            var panne = pannes.First();
            var objetPatrimonial = objetPatrimoniaux.First();
            var signalement = Signalement.CreateSignalement(objetPatrimonial, panne, DateTime.Parse("16/01/2012"),
                                                            "Très urgent, rien ne marche plus !",
                                                            DateTime.Parse("10/02/2012"), true);
            context.Signalements.Add(signalement);

            panne = pannes.Skip(1).First();
            objetPatrimonial = objetPatrimoniaux.Skip(1).First();
            signalement = Signalement.CreateSignalement(objetPatrimonial, panne, DateTime.Parse("23/12/2011"),
                                                            "Provoqué par un accident de voiture",
                                                            DateTime.Parse("03/03/2012"), false);
            context.Signalements.Add(signalement);

            panne = pannes.Skip(2).First();
            objetPatrimonial = objetPatrimoniaux.Skip(1).First();
            signalement = Signalement.CreateSignalement(objetPatrimonial, panne, DateTime.Parse("12/01/2012"),
                                                            "Dangereux pour les riverains.",
                                                            DateTime.Parse("09/02/2012"), true);
            context.Signalements.Add(signalement);
        }
    }
}
